package cn.xuchunh.guava.collection;

import com.google.common.collect.ForwardingList;

import java.util.Collection;
import java.util.List;

/**
 * Created on 2017/4/4.
 * <p>
 * Forwarding 抽象类以简化装饰者模式的使用
 * <p>
 * Forwarding 抽象类定义了一个抽象方法：delegate()，你可以覆盖这个方法来返回被装饰对象
 * <p>
 * 通过创建 ForwardingXXX 的子类并实现 delegate()方法，可以选择性地覆盖子类的方法来增加装饰功能，而不需要自己委托每个方法
 * <p>
 * 很多集合方法都对应一个”标准方法[standardxxx]”实现，可以用来恢复被装饰对象的默认行为，以提供相同的优点
 *
 * @author XCH
 */
public class AddLoggingList<E> extends ForwardingList<E> {

    final List<E> deleagate;

    public AddLoggingList(List<E> deleagate) {
        this.deleagate = deleagate;
    }

    @Override
    protected List<E> delegate() {
        return deleagate;
    }

    @Override
    public void add(int index, E element) {
        super.add(index, element);
        // do something
    }

    @Override
    public boolean add(E element) {
        // do something
        return super.add(element);
    }

    @Override
    public boolean addAll(Collection<? extends E> collection) {
        // do something
        return super.addAll(collection);
    }

    @Override
    protected boolean standardAdd(E element) {
        return super.standardAdd(element);
    }
}
